====== Individuelle Antwortprüfung ======

Formale Anforderungen an eine Antwort -- zum Beispiel dass alle Items einer Skala beantwortet wurden oder dass eine offene Texteingabe einem bestimten Muster folgt -- lassen sich mit wenigen Klicks in der Frage festlegen ([[:de:create:checks]]).

Komplexere Überprüfungen können mit ein wenig [[:de:create:php|PHP-Code]] realisiert werden. Dabei wird ein PHP-Filter gemeinsam mit der Funktion [[:de:create:functions:repeatpage|repeatPage()]] verwendet.

**Wichtig:** Der PHP-Code zur Überprüfung der Antwort muss auf der Seite __nach__ der Frage ganz oben platziert werden. Wenn also die zu prüfende Frage auf Seite 2 gestellt wird, dann muss der PHP-Code zur Prüfung auf Seite 3 ganz oben stehen.

**Hinweis:** Überlegen Sie vorab, ob eine Überprüfung der Antwort tatsächlich zielführend ist. Das ist dann der Fall, wenn Teilnehmer ihre Angaben versehentlich in einem falschen Format machen. Wenn Sie hingegen erwarten, dass sich die Teilnahmer mangels Motivation ("nur mal durchklicken") oder absichtlich nicht an die Vorgaben halten, dann ist es oftmals besser, die fehlerhaften Angaben in Kauf zu nehmen und bei der Datenbereinigung zu filtern.

**Tipp:** Weitere Details zur Programmierung von PHP-Filtern finden Sie unter [[:de:create:php-filters]].

**Tipp:** Verwenden Sie die Funktion ''[[:de:create:functions:markfail|markFail()]]'', um Eingabefelder mit fehlerhaften Angaben zu markieren.

Eine Fehlermeldung können Sie anzeigen, wenn Sie als Argument in der Funktion ''repeatPage()'' die Kennung eines Textbausteins eintragen (s. unten). Alternativ können Sie auch einen entsprechenden Textbaustein mittels [[:de:create:functions:text|text()]] anzeigen. Für die zweite Variante wählen Sie beim Anlegen des Textbausteins aus, dass der Text im Stil einer //Warnung// angezeigt wird -- dann erhält er dieselbe Formatierung wie die Standard-Fehlermeldungen.

Im folgenden finden Sie einige Anwendungsbeispiele für individuelle Antwortprüfungen inklusive dem erforderlichen PHP-Code.


===== Mehrfachauswahl-Matrix =====

In einer gewöhnlichen Skala kann man einfach überprüfen lassen, ob der Teilnehmer in jeder Zeile eine Option markiert hat. Wenn man aber eine [[:de:create:combine|kombinierte Frage]] verwendet, welche dem Teilnehmer mehrere Kreuzchen pro Zeile erlaubt (Mehrfachauswahl-Matrix), dann benötigt man ein wenig PHP-Code zur Überprüfung, ob wirklich in jeder Zeile etwas ausgewählt wurde.

Das folgende Beispiel geht davon aus, dass 4 Mehrfachauswahl-Fragen ("MA01" bis "MA04") mit jeweils 10 Items zu einer Mehrfach-Auswahlmatrix kombiniert wurden. Falls in einer Zeile kein Kreuzchen gesetzt wurde, soll diese hervorgehoben werden und es soll der Text "MA05" als Fehlermeldung angezeigt werden.


==== Variante A ====

Eine Möglichkeit besteht darin, einfach für jede Zeile (Item) die auswählten Items abzuzählen. Wurde nichts gewählt, kommt die Item-Nummer auf eine Liste ''$missing'' und anschließend werden die Fehler markiert.

Die Funktion [[:de:create:functions:id]] erstellt aus der Kennung der Rubrik ("MA"), der Nummer der Frage (z.B. 1) und der Nummer des Items (z.B. 5) die Variablen-Kennung zum Abruf der Antwort (z.B. "MA01_05").

<code php>
// Die nicht-beantworteten Items werden in der Liste $missing gesammelt
$missing = array();
// Die Funktion getItems() liefert eine Liste mit Item-Nummern (=Zeilen)
// De Konstruktion FOREACH durchläuft diese alle in einer Schleife
foreach (getItems('MA01', 'all') as $item) {
  // Alle Spalten (Fragen) für dieses Item in einer FOR-Schleife durchgehen
  $anyChecked = false;
  for ($col = 1; $col <= 4; $col++) {
    $itemID = id('MA', $col, $item);
    if (value($itemID) == 2) {
      $anyChecked = true;
    }
  }
  // Item notieren, falls nichts markiert wurde
  if (!$anyChecked) {
    $missing[] = $item;
  }
}

// Überprüfung, ob ein Item unbeantwortet blieb
if (count($missing) > 0) {
  // Die fehlenden Items hervorheben
  foreach ($missing as $item) {
    markFail(id('MA01', $item));
  }
  // Meldung anzeigen und Seite wiederholen
  repeatPage('MA05');
}
</code>


==== Variante B ====

Wer lieber mit Zahlenmengen arbeitet, kann pro Spalte die nicht angekreuzten Items (Code: 1) ermitteln und deren Schnittmenge bilden.

<code php>
$missing01 = getItems('MA01', '==', 1);
$missing02 = getItems('MA02', '==', 1);
$missing03 = getItems('MA03', '==', 1);
$missing04 = getItems('MA04', '==', 1);
$missing = array_intersect($missing01, $missing02, $missing03, $missing04);

// Überprüfung, ob ein Item unbeantwortet blieb
if (count($missing) > 0) {
  // Die fehlenden Items hervorheben
  foreach ($missing as $item) {
    markFail(id('MA01', $item));
  }
  // Meldung anzeigen und Seite wiederholen
  repeatPage('MA05');
}
</code>


===== Alle Items oder gar keines =====

Der folgende PHP-Code überprüft, ob in einer Skala alle Items beantwortet wurden -- oder gar keines. Die Kennung der Frage (im Beispiel ''AB01'') muss entsprechend der tatsächlichen Frage-Kennung geändert werden, die Fehlermeldung muss als Textbaustein abgespeichert werden. Sofern die Kennung dieses Textbausteins nicht "error_AB01" lautet, muss auch diese Kennung angepasst werden.

<code php>
// Eine Liste aller Items in der Frage erstellen
$items = getItems('AB01');
// Ermitteln der beantworteten Items
$answered = getItems('AB01', '>', 0);
// Fehler und zurück, falls nicht alle oder keines beantwortet wurden
if ((count($answered) > 0) and (count($answered) < count($items))) {
  repeatPage('error_AB01');
}
</code>


===== Konsistenzprüfung Texteingabe =====

Bei offenen Texteingaben kann eingestellt werden, dass sie nur Zahlen akzeptieren ([[:de:create:checks#eingabe_von_nummern|Antworten prüfen: Eingabe von Nummern]]). Im folgenden soll überprüft werden, ob in drei Eingabefeldern konsistente Werte eingetragen wurden.

  * TX01_01 -- Anzahl von Personen im Unternehmen
  * TY02_01 -- Anzahl von Führungskräften im Unternehmen
  * TY02_02 -- Anzahl von Mitarbeiter:innen, die kurz vor dem Ruhestand stehen

Es soll nun sichergestellt werden, dass die Werte bei TY02_01 und TY02_02 jeweils nicht höher sind als die Gesamtanzahl der Mitarbeiter:innen (TX01_01). Falls doch, soll der Text mit Kennung TX02 als Fehlermeldung angezeigt werden.

Die mittels ''value()'' abgerufenen Werte können dafür einfach mittels kleiner-als (''<'') oder größer-als (''>'') Operator verglichen werden. Das logische Oder (''||'') prüft, ob mindestens eine der beiden Voraussetzungen verletzt ist.

<code php>
if (
  (value('TY02_01') > value('TX01_01')) ||
  (value('TY02_02') > value('TX01_01'))
) {
  repeatPage('TX02');
}
</code>